 <template>
  <div>
    <h1>用户列表</h1>
    <el-row>
      <el-col :span="20" :push='2'>
        <div>
          <el-form :inline="true">
            <el-form-item style="float: left" label="查询用户信息:">
              <el-input v-model="search" placeholder="查询所需要的内容......"></el-input>
            </el-form-item>
            <el-form-item style="float: right">
              <el-button v-if="role==='manager'" type="primary" size="small" icon="el-icon-edit-outline"
                         @click="handleAdd">添加
              </el-button>
            </el-form-item>
          </el-form>
        </div>
        <div class="table">
          <el-table
            :data="tables.slice((page-1)*pageSize,page*pageSize)"
            border
            style="width: 100%">
            <el-table-column
              type="index"
              label="序号"
              align="center"
              width="60">
            </el-table-column>
            <el-table-column
              label="编号"
              align="center"
              width="220">
              <template slot-scope="scope">
                <span>{{ scope.row.userId}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="账号"
              align="center"
              width="220">
              <template slot-scope="scope">
                <span>{{ scope.row.account}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="电话"
              align="center"
              width="220">
              <template slot-scope="scope">
                <span>{{scope.row.phone}}</span>
              </template>
            </el-table-column>
            <el-table-column
              label="角色代码"
              align="center"
              width="220">
              <template slot-scope="scope">
                <span>{{scope.row.roleCode}}</span>
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="220">
              <template slot-scope="scope">
                <el-button
                  size="mini"
                  type="danger"
                  @click="handleDelete(scope.row)">删除
                </el-button>
              </template>
            </el-table-column>
          </el-table>
          <el-col :span="24" class="el-table_footstool">
            <el-pagination layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange"
                           @current-change="handleCurrentChange" :page-sizes="[10, 15]" :page-size="pageSize"
                           :total="tables.length" style="float:right;">
            </el-pagination>
          </el-col>
        </div>
      </el-col>
    </el-row>
    <el-dialog
      title="添加用户"
      :visible.sync="centerDialogVisible"
      width="30%"
      center>
      <el-form :model="account" style="padding-left: 20px" ref="formAdd" :rules="rules">
        <el-form-item label="用户账号" :label-width="formLabelWidth">
          <el-input v-model="account.accountId" autocomplete="off" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="用户电话" :label-width="formLabelWidth" prop="telephone">
          <el-input v-model="account.telephone" autocomplete="off" style="width: 80%"></el-input>
        </el-form-item>
        <el-form-item label="角色代码" :label-width="formLabelWidth">
          <el-select v-model="account.roleCode" placeholder="请选择" style="width: 80%">
            <el-option
              v-for="item in roles"
              :key="item.code"
              :label="item.code"
              :value="item.code">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
    <el-button @click="handleCancel('formAdd')">取 消</el-button>
    <el-button type="primary" @click="handleSummit('formAdd')">确 定</el-button>
  </span>
    </el-dialog>
  </div>
</template>

<script>
import userApi from '@/api/personal/user'
import roleApi from '@/api/system/role'
export default {
  name: 'account',
  data () {
    // 电话号码验证
    var checkPhone = (rule, value, callback) => {
      const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/
      if (!value) {
        return callback(new Error('电话号码不能为空'))
      }
      setTimeout(() => {
        // Number.isInteger是es6验证数字是否为整数的方法,实际输入的数字总是识别成字符串
        // 所以在前面加了一个+实现隐式转换
        if (!Number.isInteger(+value)) {
          callback(new Error('请输入数字值'))
        } else {
          if (phoneReg.test(value)) {
            callback()
          } else {
            callback(new Error('电话号码格式不正确'))
          }
        }
      }, 100)
    }
    return {
      centerDialogVisible: false, // 添加用户表单弹窗初始化为隐藏
      role: this.$store.state.role, // 获取当前登陆用户的角色
      roles: [], // 角色列表
      account: {
        accountId: '', // 用户id
        telephone: '', // 用户电话号码
        roleCode: '', // 用户的角色代码
        location: '', // 用户的位置
        password: '' // 密码
      },
      // 表单验证规则
      rules: {
        telephone: [{ validator: checkPhone, trigger: 'blur' }]
      },
      checked: true,
      accounts: [], // 用户列表
      search: '', // 搜索关键词
      page: 1, // 页号
      pageSize: 10, // 页面显示的最大数据量
      formLabelWidth: 10 // 表单标签的长度
    }
  },
  computed: {
    // 模糊搜索
    tables () {
      const search = this.search
      if (search) {
        // filter() 方法创建一个新的数组，新数组中的元素是通过检查指定数组中符合条件的所有元素
        return this.accounts.filter(data => {
          // some() 方法用于检测数组中的元素是否满足指定条件;
          // some() 方法会依次执行数组的每个元素：
          // 如果有一个元素满足条件，则表达式返回true , 剩余的元素不会再执行检测;
          // 如果没有满足条件的元素，则返回false。
          return Object.keys(data).some(key => {
            // indexOf() 返回某个指定的字符在某个字符串中首次出现的位置，如果没有找到就返回-1；
            return String(data[key]).toLowerCase().indexOf(search) > -1
          })
        })
      }
      return this.accounts
    }
  },
  methods: {
    /**
     * 添加用户表单取消按钮点击事件，清除表单内容并隐藏表单
     */
    handleCancel (formAdd) {
      this.account = {brand_right: 0}
      this.$refs[formAdd].resetFields()
      this.centerDialogVisible = false
    },
    /**
     * 通过调用api获取角色列表
     */
    getRoleList () {
      roleApi.getRoleList().then(res => {
        this.roles = res.data
      })
    },
    /**
     *通过调用api获取用户列表
     */
    getUserList () {
      userApi.getUserList().then(res => {
        this.accounts = res.data
      })
    },
    /**
     * 删除按钮点击事件，通过传递用户id给api来删除用户数据，删除数据后更新用户列表
     * @param index 序号
     * @param row 当前行
     */
    handleDelete (row) {
      userApi.deleteUser(row.userId).then(res => {
        this.$message({
          type: 'success',
          message: '删除成功'
        })
        this.getUserList()
        this.page = 1
      }
      )
    },
    /**
     *添加按钮点击事件，显示添加用户表单弹窗
     */
    handleAdd () {
      this.centerDialogVisible = true
    },
    /**
     *添加用户表单提交按钮的点击事件，提交表单时先调用api判断用户名是否存在，如果存在则添加失败
     *添加成功后更新用户列表并清除表单内容且隐藏表单
     * @param formAdd 表单名字
     */
    handleSummit (formAdd) {
      this.$refs[formAdd].validate((valid) => {
        if (valid) {
          this.account.location = '北京' // 用户初始位置设置为北京
          this.account.password = '123456' // 密码初始为123456
          userApi.addUser(this.account).then(res => {
            if (res.message === 'account exits') {
              this.$message({
                type: 'error',
                message: '此账号已存在,请重新注册'})
            } else {
              this.$message({
                type: 'success',
                message: '添加成功'
              })
              this.account = {brand_right: 0}
              this.$refs[formAdd].resetFields()
              this.centerDialogVisible = false
              this.getUserList()
            }
          })
        } else {
          return false
        }
      })
    },
    // 初始页page、初始每页数据数pageSize和数据data
    handleSizeChange (size) {
      this.pageSize = size
    },
    handleCurrentChange (val) {
      this.page = val
    }
  },
  /**
   * 创建页面时初始化角色列表及用户列表
   */
  created () {
    this.getUserList()
    this.getRoleList()
  }
}
</script>

<style scoped>

</style>
